package com.iwuyc.tools.commons.util.string;

import com.google.common.base.Splitter;

import java.util.Iterator;
import java.util.Objects;

import static com.iwuyc.tools.commons.util.math.NumberUtils.*;

/**
 * 版本比较工具
 *
 * @author Neil
 * @version 1.0.0
 * @since 2022/12/6
 */
public class AppVersionUtils {

    /**
     * 子版本号分割字符
     */
    private static final Splitter DOT_SPLITTER = Splitter.on('.');

    private AppVersionUtils() {

    }

    /**
     * 比较版本号，先比较父版本，相同比较子版本，如果父版本相同，一个有子版本，一个无，则有的较大。null视为无穷小
     * <br>
     * <pre>
     *  ex:
     *  (null,null) : 0
     *  ("1.0.0",null) : 1
     *  (null,"1.0.0") : -1
     *  ("1.0.0","1.0.0") : 0
     *  ("1.0.1","1.0.0") : 1
     *  ("1.0.0","1.0.1") : -1
     *  ("1.0.0","1.0") : 1
     * </pre>
     * @param version1 第一个待比较的值
     * @param version2 第二个待比较的值
     * @return 如果第一个值大于第二个值，则返回1，第一个值小于第二个值，则返回-1，如果两个值相等，则返回0
     * @author Neil
     */
    public static int compareVersion(String version1, String version2) {
        if (Objects.equals(version1, version2)) {
            return EQUAL;
        } else if (null == version1) {
            return LESS_THAN;
        } else if (null == version2) {
            return GREATER_THAN;
        }

        Iterable<String> versionArray1 = DOT_SPLITTER.split(version1);
        Iterable<String> versionArray2 = DOT_SPLITTER.split(version2);
        final Iterator<String> v1It = versionArray1.iterator();
        final Iterator<String> v2It = versionArray2.iterator();
        boolean v1HasNext = v1It.hasNext();
        boolean v2HasNext = v2It.hasNext();
        // 循环校验每一个子版本
        while (v1HasNext && v2HasNext) {
            final String v1 = v1It.next();
            final String v2 = v2It.next();
            // 校验子版本号
            final int compareResult = compareStr(v1, v2);
            if (compareResult != 0) {
                return compareResult;
            }
            v1HasNext = v1It.hasNext();
            v2HasNext = v2It.hasNext();
        }
        // 如果v1还有子版本，说明v1比较大
        if (v1HasNext) {
            return GREATER_THAN;
        }
        // 如果v2还有子版本，说明v1比较小
        return v2HasNext ? LESS_THAN : EQUAL;
    }

    private static int compareStr(String v1, String v2) {
        final int v1Length = v1.length();
        final int v2Length = v2.length();
        if (v1Length > v2Length) {
            return GREATER_THAN;
        } else if (v1Length < v2Length) {
            return LESS_THAN;
        }
        return v1.compareTo(v2);
    }
}
